package com.base.mapper.voipmapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.base.po.param.UserData;
import com.base.po.voip.*;
import com.base.po.voip_sdk.SubscribersResponse;
import org.apache.ibatis.annotations.Param;
import com.base.po.sqlparam.SubscribersExamplePage;
import com.base.utils.Page;

/**
 * @author admin
 */
public interface SubscribersMapper {
    int countByExample(SubscribersExample example);

    int deleteByExample(SubscribersExample example);

    int deleteByPrimaryKey(String id);

    int insert(Subscribers record);

    int insertSelective(Subscribers record);

    List<Subscribers> selectByExample(SubscribersExample example);

    List<Subscribers> selectByExamplePage(SubscribersExamplePage example);

    List<Subscribers> selectOrExamplePage(SubscribersExamplePage example);

    List<Subscribers> selectByParentId(String parentid);

    List<Subscribers> selectBySharePer(String shareper);

    List<Subscribers> selectBySharePerJSJ(String shareper);

    List<String> selectByMobile(@Param("mobile") String mobile);

    List<String> selectByMobileAndParentId(@Param("mobile") String mobile, @Param("parentid") String parentid);

    Subscribers selectBySubscribers(@Param("mobile") String mobile, @Param("parentid") String parentid);

    List<Subscribers> selectBySub(@Param("mobile") String mobile, @Param("parentid") String parentid);

    List<SubscribersResponse> selectBySubForSbd(@Param("mobile") String mobile, @Param("parentid") String parentid);

    List<Subscribers> selectAllSub(@Param("parentid") String parentid, @Param("isnull") Integer isnull);

    List<String> selectByMobileAndShopId(@Param("mobile") String mobile, @Param("shopid") String shopid);

    List<Subscribers> selectByAllForExport(@Param("username") String username, @Param("parentid") String parentid,
                                           @Param("shopid") String shopid, @Param("startTimeFrom") String startTimeFrom,
                                           @Param("startTimeTo") String startTimeTo, @Param("start") Integer start, @Param("size") Integer size);

    List<Subscribers> selectByAll(@Param("page") Page page, @Param("shareper") String shareper,
                                  @Param("mobile") String mobile, @Param("username") String username,
                                  @Param("parentid") String parentid, @Param("shopid") String shopid, @Param("datastatus") Boolean datastatus,
                                  @Param("startTimeFrom") String startTimeFrom, @Param("startTimeTo") String startTimeTo,
                                  @Param("endTimeFrom") String endTimeFrom, @Param("endTimeTo") String endTimeTo);

    List<Subscribers> selectByParentid(@Param("page") Page page, @Param("parentid") String parentid, @Param("shareper") String shareper,
                                       @Param("mobile") String mobile, @Param("username") String username, @Param("id") String id, @Param("shopid") String shopid,
                                       @Param("datastatus") Boolean datastatus, @Param("startTimeFrom") String startTimeFrom,
                                       @Param("startTimeTo") String startTimeTo, @Param("endTimeFrom") String endTimeFrom,
                                       @Param("endTimeTo") String endTimeTo);

//	List<Subscribers> selectByParentid(@Param("page") Page page, @Param("parentid") String parentid,
//			@Param("mobile") String mobile, @Param("id") String id, @Param("datastatus") Boolean datastatus);

    List<Subscribers> selectByShopid(@Param("page") Page page, @Param("shopid") String shopid,
                                     @Param("mobile") String mobile, @Param("id") String id, @Param("datastatus") Boolean datastatus,
                                     @Param("startTimeFrom") String startTimeFrom, @Param("startTimeTo") String startTimeTo,
                                     @Param("endTimeFrom") String endTimeFrom, @Param("endTimeTo") String endTimeTo);

    List<Subscribers> selectByShopidNotAll(@Param("page") Page page, @Param("shopid") String shopid, @Param("shareper") String shareper,
                                           @Param("mobile") String mobile, @Param("username") String username, @Param("id") String id, @Param("datastatus") Boolean datastatus,
                                           @Param("startTimeFrom") String startTimeFrom, @Param("startTimeTo") String startTimeTo,
                                           @Param("endTimeFrom") String endTimeFrom, @Param("endTimeTo") String endTimeTo);

    Subscribers selectByPrimaryKey(String id);

    Subscribers selectByIsOpen(String isopenmember);

    Subscribers selectByPid(@Param("parentid") String parentid, @Param("pid") String pid);

    Subscribers selectByRebatePid(@Param("parentid") String parentid, @Param("rebatepid") String rebatepid);

    Subscribers selectBySpecialId(@Param("parentid") String parentid, @Param("specialId") String specialId);

    Subscribers selectByPddPid(@Param("parentid") String parentid, @Param("pddPid") String pddPid);

    Subscribers selectByJdPid(@Param("parentid") String parentid, @Param("jdPid") String jdPid);

    List<Subscribers> selectByWxOpenId(@Param("wxOpenId") String wxOpenId, @Param("ParentId") String ParentId);

    List<Subscribers> selectByAppleUserId(@Param("appleUserId") String appleUserId, @Param("ParentId") String ParentId);

    int updateByExampleSelective(@Param("record") Subscribers record, @Param("example") SubscribersExample example);

    int updateByExample(@Param("record") Subscribers record, @Param("example") SubscribersExample example);

    int updateByPrimaryKeySelective(Subscribers record);

    int updateByPrimaryKey(Subscribers record);

    int countByAll(@Param("shareper") String shareper, @Param("mobile") String mobile, @Param("username") String username,
                   @Param("parentid") String parentid, @Param("shopid") String shopid,
                   @Param("datastatus") Boolean datastatus, @Param("startTimeFrom") String startTimeFrom,
                   @Param("startTimeTo") String startTimeTo, @Param("endTimeFrom") String endTimeFrom,
                   @Param("endTimeTo") String endTimeTo);

    int countByParentid(@Param("parentid") String parentid, @Param("shareper") String shareper,
                        @Param("mobile") String mobile, @Param("username") String username, @Param("id") String id,
                        @Param("shopid") String shopid, @Param("datastatus") Boolean datastatus,
                        @Param("startTimeFrom") String startTimeFrom, @Param("startTimeTo") String startTimeTo,
                        @Param("endTimeFrom") String endTimeFrom, @Param("endTimeTo") String endTimeTo);

    int countByShopid(@Param("shopid") String shopid, @Param("mobile") String mobile, @Param("id") String id,
                      @Param("datastatus") Boolean datastatus, @Param("startTimeFrom") String startTimeFrom,
                      @Param("startTimeTo") String startTimeTo, @Param("endTimeFrom") String endTimeFrom,
                      @Param("endTimeTo") String endTimeTo);

    int countByShopidNotAll(@Param("shopid") String shopid, @Param("shareper") String shareper,
                            @Param("mobile") String mobile, @Param("username") String username, @Param("id") String id,
                            @Param("datastatus") Boolean datastatus, @Param("startTimeFrom") String startTimeFrom,
                            @Param("startTimeTo") String startTimeTo, @Param("endTimeFrom") String endTimeFrom,
                            @Param("endTimeTo") String endTimeTo);

    /**
     * 用户总数
     *
     * @param parentid 商家/代理商I
     * @return
     */
    int selectByCount(@Param("parentid") String parentid, @Param("begin") Date begin, @Param("end") Date end);

    int selectByCountShop(@Param("shopid") String shopid, @Param("begin") Date begin, @Param("end") Date end);

    // 商家的购物消费统计
    Subscribers countByShopSA(@Param("shopid") String shopid, @Param("mobile") String mobile,
                              @Param("username") String username, @Param("shopname") String shopname);

    List<Subscribers> selectByShopSA(@Param("page") Page page, @Param("shopid") String shopid,
                                     @Param("mobile") String mobile, @Param("username") String username, @Param("shopname") String shopname);

    // 代理商的购物消费统计
    Subscribers countByShopPA(@Param("parentid") String parentid, @Param("mobile") String mobile,
                              @Param("username") String username, @Param("shopname") String shopname);

    List<Subscribers> selectByShopPA(@Param("page") Page page, @Param("parentid") String parentid,
                                     @Param("mobile") String mobile, @Param("username") String username, @Param("shopname") String shopname);

    // 商家的通话消费统计
    Subscribers countByCallSA(@Param("shopid") String shopid, @Param("mobile") String mobile,
                              @Param("username") String username, @Param("shopname") String shopname);

    List<Subscribers> selectByCallSA(@Param("page") Page page, @Param("shopid") String shopid,
                                     @Param("mobile") String mobile, @Param("username") String username, @Param("shopname") String shopname);

    // 代理商的通话消费统计
    Subscribers countByCallPA(@Param("parentid") String parentid, @Param("mobile") String mobile,
                              @Param("username") String username, @Param("shopname") String shopname);

    List<Subscribers> selectByCallPA(@Param("page") Page page, @Param("parentid") String parentid,
                                     @Param("mobile") String mobile, @Param("username") String username, @Param("shopname") String shopname);

    // 获取当前用户的粉丝信息
    int countByPer(@Param("perid") String perid);

    List<Subscribers> selectByPer(@Param("page") Page page, @Param("perid") String perid);

    // 获取分红信息
    int selectByBonus(@Param("parentid") String parentid, @Param("shopid") String shopid, @Param("bonus1level") Integer bonus1level,
                      @Param("bonus2level") Integer bonus2level, @Param("bonus3level") Integer bonus3level);

    List<Subscribers> selectBonusByAll(@Param("page") Page page, @Param("bonus1level") Integer bonus1level,
                                       @Param("bonus2level") Integer bonus2level, @Param("bonus3level") Integer bonus3level);

    List<Subscribers> selectBonusByParentid(@Param("page") Page page, @Param("parentid") String parentid,
                                            @Param("bonus1level") Integer bonus1level, @Param("bonus2level") Integer bonus2level,
                                            @Param("bonus3level") Integer bonus3level);

    List<Subscribers> selectBonusByShopidNotAll(@Param("page") Page page, @Param("shopid") String shopid,
                                                @Param("bonus1level") Integer bonus1level, @Param("bonus2level") Integer bonus2level,
                                                @Param("bonus3level") Integer bonus3level);

    int countBonusByAll(@Param("bonus1level") Integer bonus1level, @Param("bonus2level") Integer bonus2level,
                        @Param("bonus3level") Integer bonus3level);

    int countBonusByParentid(@Param("parentid") String parentid, @Param("bonus1level") Integer bonus1level,
                             @Param("bonus2level") Integer bonus2level, @Param("bonus3level") Integer bonus3level);

    int countBonusByShopidNotAll(@Param("shopid") String shopid, @Param("bonus1level") Integer bonus1level,
                                 @Param("bonus2level") Integer bonus2level, @Param("bonus3level") Integer bonus3level);

    /**
     * 获取代理商紧急控制信息
     *
     * @param parentId
     * @return
     */
    List<Agentinfoes> findParentAgentInfo(@Param("parentId") String parentId);

    /**
     * 顺通
     */
    List<Subscribers> selectNextPer1(String userId);

    List<Subscribers> selectNextPer2(String userId);

    List<Subscribers> selectNextPer3(String userId);

    List<Subscribers> selectNextPer4(String userId);

    List<Subscribers> selectNextPer5(String userId);

    Subscribers selectsomeByPrimaryKey(@Param("userid") String userid);

    List<Subscribers> selectByShopidOnly(@Param("shopid") String shopid);

    int updateWxUntying(String id);

    int hasSub(@Param("mobile") String mobile, @Param("parentId") String parentId);

    List<String> selectMobiles(@Param("userid") String userid);

    int updateIsUserAuthById(@Param("id") String id);

    List<String> selectForTeamCommission(@Param("shareId") String shareId, @Param("list") List<String> list);

    /**
     * 递归查询
     */
    String findParList(@Param("id") String id);

    List<String> selectForShareId(@Param("shareId") String shareId);

    List<String> selectMemberForShareId(@Param("shareId") String shareId);

    List<String> selectForSharePer(@Param("list") List<String> list);

    List<Subscribers> selectForDirect(@Param("shareId") String shareId, @Param("page") Page page);

    int countForDirect(@Param("shareId") String shareId);

    List<ChildrenAgent> getChildrenAgent(@Param("userId") String userId);

    Integer countByMenber();

    List<Daili> selectDaili(@Param("page") Page page);

    /**
     * 获取用户代理等级和上级的代理等级
     */
    Map<String, Integer> getLevel(@Param("userId") String userId);

    /**
     * 用户待结算收益
     *
     * @param userId 用户id
     * @param rebit  收益占比
     * @return
     */
    BigDecimal getTobeSetted(@Param("userId") String userId, @Param("rebit") BigDecimal rebit);

    /**
     * 用户已结算收益
     *
     * @param userId 用户id
     * @param rebit  收益占比
     * @return
     */
    BigDecimal getHasSetted(@Param("userId") String userId);

    /**
     * 获取收益详情
     *
     * @return status 0 未结算 1 已结算
     */
    List<Map<String, Object>> getCommisionDetail(@Param("userId") String userId, @Param("rebit") BigDecimal rebit);

    /**
     * 获取团队总业绩
     *
     * @param userId 代理id
     */
    BigDecimal getTeamTotalPrice(@Param("userId") String userId);

    Integer getTeamPtSuccessNum(@Param("userId") String userId);

    /**
     * 获取下级用户等级人数
     *
     * @param userId 用户id
     */
    UserData selectForLevelUp(@Param("userId") String userId);
}